<?php

/**
 * Subclass for representing a row from the 'hc_post' table.
 *
 *
 *
 * @package lib.model
 */
class Post extends BasePost
{
  public function __toString()
  {
    return $this->getTitle();
  }

  public function getCommentsNumber()
  {
    return $this->countComments();
  }

  public function setTitle($v)
  {
    $this->setSlug($v);
    parent::setTitle($v);
  }

  /**
   * retourne le lien permanent d'une actualite
   * le lien est basé sur la concaténation de l'année, du mois, du jour et du slug de l'actualite
   * ex d'url générée:
   * <code>/news/fr/2007/12/05/actualite.html</code>
   */
  public function getPermalink()
  {
    $matches = array();
    preg_match('/(19\d{2}|20\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])(?:.*)/', $this->getPublishedAt(), $matches, PREG_OFFSET_CAPTURE);
    $permalink = '@newsOne?sf_culture='.$this->getLang().'&year='.$matches[1][0].'&month='.$matches[2][0].'&day='.$matches[3][0].'&slug='.$this->getSlug();
    return $permalink;
  }

  /**
   * renseigne le champ Slug d'un objet post
   * en générant à partir du titre de cet objet
   * une chaine de caractère unique viable en tant qu'url
   *
   * @param string v chaine a formater
   */
  public function setSlug($v)
  {
    $v = $this->generateUniqueSlug($v);
    parent::setSlug($v);
  }

  public function setPublishedAt($v)
  {
    if ($v == null)
    {
      $v = date('m/d/Y');
    }
    parent::setPublishedAt($v);
  }

  /**
   * Formatte un tableau en chaine de caractere avec pour
   * delimiteur espace.
   * ex:
   * <code>
   * array( 'toto', 'tata' ); =>
   * "toto tata";
   * </code>
   *
   * @return string chaine formattée
   * @author bozec
   */
  public function getSerializeTags()
  {
    $sr = '';
    foreach ($this->getTags() as $tag)
    {
      $sr.= $tag . ' ';
    }
    return $sr;
  }

  /**
   * scinde une chaine de caractere en tableau
   * avec pour delimiteur espace.
   * Tous les caractères spéciaux sont supprimées
   *
   * @author bozec
   */
  public function setSerializeTags($v)
  {
    $tags = split(' ', $v);
    foreach($tags as $tag)
    {
      $this->addTag(preg_replace('/[^a-zA-Z0-9]/', '', $tag));
    }
  }

  /**
   * function qui génère une chaine de slug unique
   *
   * @param string v chaine a vérifier
   */
  private function generateUniqueSlug($v)
  {
    $v = text::str2URL($v, false);
    while($this->isNotUniqueSlug($v))
    {
      $matches = array();
      preg_match('/(?:.*)-(\d+)$/', $v, $matches);
   

      if (count($matches)>0)
      {
        $v = preg_replace('/(.*)-(\d+)$/', '${1}-'.($matches[1]+1), $v);
      }
      else
      {
        $v.= '-1';
      }
    }
    return $v;
  }

  /**
   * function qui teste l'unicité d'une chaine de caractere
   *
   * @param string v chaine à tester
   */
  private function isNotUniqueSlug($v)
  {
    $c = new Criteria();
    $c->add(PostPeer::PUBLISHED_AT, substr($this->getPublishedAt(), 10).'%', Criteria::LIKE);
    $c->add(PostPeer::SLUG, $v);
    $nbSlug = PostPeer::doCount($c);

    return ($nbSlug > 0) ? true : false;
  }
  
  /**
   * function qui retourne tous les commentaires
   * d'un objet Post qui ne sont pas spammés
   * 
   * @return array of object comments
   * 
   */
  public function getNoSpamComments()
  {
    $c = new Criteria();
    $c->addJoin(PostPeer::ID, CommentPeer::POST_ID);
    $c->add(CommentPeer::IS_SPAM, false);
    return self::getComments($c);
  }

	/**
	 * Returns the number of related No spam Comments.
	 *
	 * @throws     PropelException
	 */
	public function countNoSpamComments()
	{
		// include the Peer class
		include_once dirname(__FILE__).'/om/BaseCommentPeer.php';

	  $criteria = new Criteria();
		$criteria->add(CommentPeer::IS_SPAM, false);
		$criteria->add(CommentPeer::POST_ID, $this->getId());

		return CommentPeer::doCount($criteria);
	}
  
}

sfPropelBehavior::add('Post', array('sfPropelActAsTaggableBehavior'));